home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Night Owl 6
/
Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso
/
038a
/
bas_int1.zip
/
INT_52.BAS
< prev
next >
Wrap
BASIC Source File
|
1991-06-30
|
3KB
|
84 lines
'=======================================================================
' Quick Basic Forum
' Date : 24-Jun-91
' From : Steve Halko
'Subject : Re: Function 52h
' Determining logical drives avaiable
'======================================================================
SUB LogicalDrives
'First get the major DOS version
inreg.ax = &H3000
CALL interruptx(&H21, inreg, outreg)
MajorVersion = outreg.ax AND &HFF
'Now get into the CVT (Configuration Variable Table or DOS List of Lists)
inreg.ax = &H5200
CALL interruptx(&H21, inreg, outreg)
DEF SEG = outreg.es 'Segement of CVT
PRINT "Number of physical drives = "; PEEK(outreg.bx + &H20)
NrLogDrives = PEEK(outreg.bx + &H21)
PRINT "Number of Logical Drives = "; NrLogDrives
PRINT
REDIM Drives$(NrLogDrives - 1)
SELECT CASE MajorVersion
'For DOS Version 2
CASE 2
'Get Segment/Offset of DPB
DPBSeg = PEEK(outreg.bx + &H2) + 256 * PEEK(outreg.bx + &H3)
DPBOffset = PEEK(outreg.bx) + 256 * PEEK(outreg.bx + &H1)
'Step through DPB Chain
NrValidDrives = 0
DO
DEF SEG = DPBSeg
Drives$(NrValidDrives) = CHR$(PEEK(DPBOffset + &H1E))
NrValidDrives = NrValidDrives + 1
'Check for last DPB in chain
IF (PEEK(DPBOffset + &H18) = 255) AND
_(PEEK(DPBOffset + &H19) = 255) THEN EXIT DO
'If more, then get new DPB Segment/Offset
DPBSeg = PEEK(DPBOffset + &H1A) + 256 * PEEK(DPBOffset + &H1B)
DPBOffset = PEEK(DPBOffset + &H18) + 256 * PEEK(DPBOffset + &H19)
LOOP
'For DOS Versions 3 and 4
CASE 3, 4
'Get Segment/Offset of LDT
LDTSeg = PEEK(outreg.bx + &H18) + 256& * PEEK(outreg.bx + &H19)
LDTOffset = PEEK(outreg.bx + &H16) + 256& * PEEK(outreg.bx + &H17)
DEF SEG = LDTSeg
NrValidDrives = 0
IF MajorVersion = 3 THEN
LDTSize = 81
ELSE
LDTSize = 88
END IF
'Step through LDT
FOR i = 0 TO NrLogDrives - 1
'Check for DPB pointer = 0000:0000
FOR j = &H45 TO &H48
IF (PEEK(LDTOffset + i * LDTSize + j) <> 0) THEN
'If valid drive
Drives$(NrValidDrives) = CHR$(i + 65)
NrValidDrives = NrValidDrives + 1
EXIT FOR
END IF
NEXT j
NEXT i
CASE 5
'This section TBD
END SELECT
END SUB